home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1999 / MacHack 1999.toast / The Hacks / Sound-IN-Sane / Sound-IN-Sane.c < prev    next >
Text File  |  1999-06-26  |  4KB  |  190 lines

  1. /*=============================*\
  2.           Sound-IN-Sane
  3.     A MacHack 1999 Production
  4.  
  5.     Developed and Written by
  6.  
  7.           Shawn Platkus
  8.  
  9.           June 25, 1999
  10. \*=============================*/
  11.  
  12. // This application uses the thus far undocumented MacOS calls that modify the
  13. //    Sound Output source which is more commonly known as the Sound Monitor Source.
  14. //    This is the same technique that the Sound Source Control Strip uses.
  15. //    However, this app takes advantage of a peculiar side effect of these calls to provide
  16. //    its bizzare and totally insane functionality.
  17.  
  18.  
  19. //    System Includes
  20. #include <Dialogs.h>
  21. #include <Devices.h>
  22. #include <Fonts.h>
  23. #include <Menus.h>
  24. #include <NumberFormatting.h>
  25. #include <Quickdraw.h>
  26. #include <Scrap.h>
  27. #include <Sound.h>
  28. #include <ToolUtils.h>
  29.  
  30. //    Local Includes
  31. #include "Sound-IN-Sane.h"
  32. #include "SIS_UI.h"
  33.  
  34.  
  35. //    Globals
  36.  
  37. Component                device;            // Sound Device
  38. ComponentDescription    looking;        // Sound Device Description
  39. long                    sndDevRef;        // Sound Device Input Reference
  40. Str255                    FullNames[kMaxSoundSources + 1];    // Full Descriptions of the Sound Sources
  41. OSType                    SourceTypes[kMaxSoundSources + 1];    // Selectors for the Sound Sources
  42.  
  43.  
  44. //***
  45. //        main
  46. //***
  47.  
  48. void main ( void )
  49. {
  50.     ToolboxInit();
  51.     MenuBarInit();
  52.     
  53.     EventLoop();
  54. }
  55.  
  56.  
  57. //***
  58. //        ApplicationInit
  59. //***
  60.  
  61. Boolean ApplicationInit (void)
  62. {
  63.     OSErr                err;
  64.     Boolean                bOKtoRun = true;
  65.     NumVersionVariant    smVersion;
  66.  
  67.  
  68.     // Check the sound Manager Version
  69.     smVersion.parts = SndSoundManagerVersion();
  70.  
  71.     // Only Sound Manager 3.1 or later implements the SoundComponentGet/SetInfo calls...
  72.     // If you know you're going to run on System 7.5 or later, you can skip the SM version check.
  73.  
  74.     if (!(smVersion.whole >= 0x03100000))
  75.     {
  76.         bOKtoRun = false;
  77.     }
  78.     else    
  79.     {
  80.         // Get the built-in sound device
  81.         looking.componentType = kSoundOutputDeviceType;
  82.         looking.componentSubType = 0;
  83.         looking.componentManufacturer = kAppleManufacturer;
  84.         looking.componentFlags = 0;
  85.         looking.componentFlagsMask = 0;
  86.         device = FindNextComponent (0, &looking);
  87.         
  88.         // Get the Sound Input Device Reference Number
  89.         err = SPBOpenDevice(NULL, siWritePermission, &sndDevRef);
  90.         if (err != noErr)
  91.         {
  92.             bOKtoRun = false;
  93.         }
  94.     }
  95.  
  96.     if (bOKtoRun)
  97.     {
  98.         GetSoundSources();
  99.     }
  100.     return !bOKtoRun;
  101. }
  102.  
  103.  
  104. //***
  105. //        ApplicationCleanUp
  106. //***
  107.  
  108. void ApplicationCleanUp (void)
  109. {
  110.     SPBCloseDevice(sndDevRef);
  111.     
  112.     return;
  113. }
  114.  
  115.  
  116. //***
  117. //        GetSoundSources
  118. //***
  119.  
  120. void GetSoundSources (void)
  121. {
  122.     SoundInfoList        monitorList;
  123.     Handle                sourceNames;
  124.     OSErr                err;
  125.     long                offset;
  126.     short                numNames;
  127.     int                    i;
  128.     char                sourceName[255];
  129.  
  130.                   
  131. //    if (sourceNames != NULL)
  132.     {
  133.         err = SPBGetDeviceInfo(sndDevRef, siInputSourceNames, &sourceNames);
  134.         // siInputSourceNames will return a structure that looks like:
  135.         //  struct {
  136.         //      short   numNames;
  137.         //      PString names[numNames];
  138.         //  };
  139.     }
  140.                   
  141.     if (err == noErr)
  142.     {
  143. //        printf ("\nThe sound input source names are:\n");
  144.                   
  145.         numNames = (*(short**)sourceNames)[0];
  146.  
  147.         if (numNames > kMaxSoundSources)
  148.         {
  149.             numNames = kMaxSoundSources;
  150.         }
  151.  
  152.         offset = 3;
  153.         for (i = 0; i < numNames; i++)
  154.         {
  155.             BlockMoveData (&((char*)(*sourceNames))[offset], 
  156.                            sourceName, (*(char**)sourceNames)[offset-1]);
  157.             sourceName[(*(char**)sourceNames)[offset-1]] = 0;
  158. //            CopyCStringToPascal(sourceName, FullNames[i]);
  159. // copy sourceName which is now a CString into the Full Names Array!
  160. //            printf ("  %s\n", sourceName);
  161.             offset += (*(char**)sourceNames)[offset-1] + 1;
  162.         }
  163.     }
  164.     
  165.     // Get The Sound Source Selectors
  166.  
  167.     SPBCloseDevice(sndDevRef);
  168.     return;
  169. }
  170.  
  171.  
  172. //***
  173. //        CycleSoundSources
  174. //***
  175.  
  176. void CycleSoundSources ()
  177. {
  178.     OSType                    source;
  179.     OSErr                    err;
  180.  
  181.     // find out which source is monitored
  182.     GetSoundOutputInfo(device, siMonitorSource, &source);
  183.  
  184.     if (source == kIntMicSource)
  185.         err = SetSoundOutputInfo(device, siMonitorSource, (void *)kCDSource);
  186.     else
  187.         err = SetSoundOutputInfo(device, siMonitorSource, (void *)kIntMicSource);
  188.  
  189. }
  190.